package com.boil.qz.safekavass.service;

import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.dao.MybatisDao;
import com.boil.qz.safekavass.model.ReportRes;
import com.boil.qz.safekavass.pojo.*;
import com.boil.qz.safekavass.web.request.param.ReportWeixinSendredpackParam;
import com.boil.util.Constants;
import com.boil.util.DateUtils;
import com.boil.util.Page;
import com.boil.util.Page1;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by ChenYong on 2017-04-17.
 * <br>
 * 举报 Service。
 */
@Service
public class ReportResService {
    /**
     * 注入 Mybatis Dao
     */
    @Autowired
    private MybatisDao mybatisDao;
    /**
     * 注入微信发普通红包 Service
     */
    @Autowired
    private WeixinSendredpackService weixinSendredpackService;

    /**
     * 保存举报。
     *
     * @param loingUserId 登录用户 ID
     * @param reportRes   举报
     * @return 保存记录数
     */
    public int saveReportRes(long loingUserId, ReportRes reportRes) {
        int saveCount = Constants.VALUE_0;

        saveCount = mybatisDao.insert("reportResNs.save", reportRes);

        saveReportResRecord(loingUserId, reportRes.getId(), reportRes.getReportResult(), reportRes.getReportCreateTime());

        return saveCount;
    }

    /**
     * 保存举报处理流程记录。
     *
     * @param reportHandlePersonId 处理人 ID
     * @param reportId             举报 ID
     * @param reportResult         举报结果
     * @param handleTime           处理时间
     * @return 保存记录数
     */
    public int saveReportResRecord(long reportHandlePersonId, long reportId, String reportResult, Date handleTime) {
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("userId", reportHandlePersonId);
        param.put("reportId", reportId);
        param.put("reportResult", reportResult);
        param.put("createTime", handleTime);

        return mybatisDao.insert("reportResNs.saveRecord", param);
    }

    /**
     * 保存举报微信发普通红包。
     *
     * @param reportId  举报 ID
     * @param mchBillno 商户订单号
     * @return 保存记录数
     */
    public int saveReportWeixinSendredpack(long reportId, String mchBillno) {
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("reportId", reportId);
        param.put("mchBillno", mchBillno);

        return mybatisDao.insert("reportResNs.saveReportWeixinSendredpack", param);
    }


    /**
     * 根据 ID 查询举报。
     *
     * @param id ID 编号
     * @return 返回举报
     */
    public ReportRes findById(long id) {
        Map<String, Object> map = new HashMap<String, Object>();

        map.put("id", id);

        return mybatisDao.selectOne("reportResNs.findById", map);
    }

    /**
     * 分页查询举报。
     *
     * @param page 分页实例
     */
    public void findInPage(Page<ReportResVo> page) {
        mybatisDao.selectInPage("reportResNs.findInPage", page);
    }

    /**
     * 根据 openid 查询分页查询举报。
     *
     * @param page1 分页实例
     */
    public void findInPageByOpenid(Page1<ReportResVo> page1) {
        mybatisDao.selectInPage("reportResNs.findInPageByOpenid", page1);
    }

    /**
     * 根据举报月份统计举报情况。
     *
     * @param reportMonth 举报月份
     * @return 根据举报月份统计举报情况的实例集合
     */
    public List<ReportCountByReportMonthVo> findCountByReportMonth(String reportMonth) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put(Constants.MONTH_STR, reportMonth);

        return mybatisDao.selectList("reportResNs.findCountByReportMonth", map);
    }

    /**
     * 根据发红包月份统计红包发放情况。
     *
     * @param sendredpackMonth 发红包月份
     * @return 根据发红包月份统计红包发放情况的实例集合
     */
    public List<ReportCountBySendredpackMonthVo> findCountBySendredpackMonth(String sendredpackMonth) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put(Constants.MONTH_STR, sendredpackMonth);

        return mybatisDao.selectList("reportResNs.findCountBySendredpackMonth", map);
    }

    /**
     * 根据领红包月份统计红包领取情况。
     *
     * @param receiveredpackMonth 领红包月份
     * @return 根据领红包月份统计红包领取情况的实例集合
     */
    public List<ReportCountByReceiveredpackMonthVo> findCountByReceiveredpackMonth(String receiveredpackMonth) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put(Constants.MONTH_STR, receiveredpackMonth);

        return mybatisDao.selectList("reportResNs.findCountByReceiveredpackMonth", map);
    }

    /**
     * 更新举报。
     *
     * @param loingUserId  登录用户 ID
     * @param reportId     举报 ID
     * @param reportResult 举报结果
     * @return 更新的记录
     */
    public int updateById(long loingUserId, long reportId, String reportResult) {
        int updateCount = Constants.VALUE_0;

        Map<String, Object> param = new HashMap<String, Object>();
        param.put("id", reportId);
        param.put("reportResult", reportResult);

        updateCount = mybatisDao.update("reportResNs.updateById", param);

        if (updateCount > Constants.VALUE_0) {
            saveReportResRecord(loingUserId, reportId, reportResult, DateUtils.getCurrDate());
        }

        return updateCount;
    }

    /**
     * 更新举报奖金。
     *
     * @param id          举报 ID
     * @param reportMoney 举报奖金
     * @return 更新的记录
     */
    public int updateReportMoneyById(long id, String reportMoney) {
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("id", id);
        param.put("reportMoney", reportMoney);

        return mybatisDao.update("reportResNs.updateReportMoneyById", param);
    }

    /**
     * 处理微信发普通红包。
     *
     * @param resultVo    结果 Vo
     * @param loingUserId 登录用户 ID
     * @param param       举报微信发普通红包的请求参数
     */
    public void doSendredpack(ResultVo resultVo, long loingUserId, ReportWeixinSendredpackParam param) {
        // 根据举报 ID 查询举报
        ReportRes reportRes = findById(param.getId());

        // 只有举报结果为“已核实”或“已发放”，才能发红包
        if (Constants.REPORT_RESULT_3.equals(reportRes.getReportResult()) || Constants.REPORT_RESULT_5.equals(reportRes.getReportResult())) {
            // 举报来源必须是微信
            if (Constants.WEIXIN.equals(reportRes.getReportSource()) && StringUtils.isNotBlank(reportRes.getOpenid())) {
                // 红包的金额正确
                if ((param.getAmount() >= Constants.VALUE_1) && (param.getAmount() <= Constants.VALUE_499)) {
                    WeixinSendredpackParamVo weixinSendredpackParamVo = new WeixinSendredpackParamVo();
                    weixinSendredpackParamVo.setTotal_num(Constants.VALUE_1);
                    weixinSendredpackParamVo.setRe_openid(reportRes.getOpenid());
                    weixinSendredpackParamVo.setRemark(param.getRemark());
                    weixinSendredpackParamVo.setTotal_amount(param.getAmount() * Constants.VALUE_100);

                    weixinSendredpackService.doSendredpack(resultVo, weixinSendredpackParamVo);

                    // 发红包成功
                    if (resultVo.getResultCode() == Constants.SUCCESS) {
                        // 保存举报微信发普通红包
                        saveReportWeixinSendredpack(param.getId(), weixinSendredpackParamVo.getMch_billno());

                        // 更新举报结果为“已发放”
                        updateById(loingUserId, param.getId(), Constants.REPORT_RESULT_5);

                        // 举报奖金
                        int reportMoney = ((StringUtils.isBlank(reportRes.getReportMoney()) ? 0 : Integer.parseInt(reportRes.getReportMoney())) + (weixinSendredpackParamVo.getTotal_amount() / Constants.VALUE_100));

                        // 更新举报奖金
                        updateReportMoneyById(param.getId(), String.valueOf(reportMoney));
                    }

                    // 红包的金额错误
                } else {
                    resultVo.setResultCode(Constants.SENDREDPACK_ERROR);
                    resultVo.setResultMsg(Constants.SENDREDPACK_AMOUNT_ERROR_MSG);
                }

                // 举报来源是其他
            } else {
                resultVo.setResultCode(Constants.SENDREDPACK_ERROR);
                resultVo.setResultMsg(Constants.REPORT_NOT_WEIXIN_STOP_SENDREDPACK_MSG);
            }

            // 举报结果为其他，禁止发红包
        } else {
            resultVo.setResultCode(Constants.SENDREDPACK_ERROR);
            resultVo.setResultMsg(Constants.REPORT_RESULT_NOT_3_STOP_SENDREDPACK_MSG);
        }
    }

    /**
     * 根据用户 ID 更新举报记录。
     *
     * @param userId 用户 ID
     * @return 更新的记录数
     */
    public int updateReportResRecordByUserId(long userId) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("userId", userId);

        return mybatisDao.update("reportResNs.updateReportResRecordByUserId", map);
    }
}